<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Vue.set</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>

<body>
    <h1>Vue.set 全局操作</h1>
    <p>
        Vue.set 的作用就是在构造器外部操作构造器内部的数据、属性或者方法。比如在vue构造器内部定义了一个count为1的数据，我们在构造器外部定义了一个方法，要每次点击按钮给值加1.就需要用到Vue.set。
    </p>
    <p>
        由于Javascript的限制，Vue不能自动检测以下变动的数组。
        <ul>
            <li>
                当你利用索引直接设置一个项时，vue不会为我们自动更新。
            </li>
            <li>
                当你修改数组的长度时，vue不会为我们自动更新。
            </li>
        </ul>

    </p>
    <a href="../index.html">返回</a>
    <hr />
    <div id="app">
        {{count}}

        <ul>
            <li v-for="(item,index) in pro">{{item}}</li>
        </ul>
    </div>
    <div>
        <button onclick="add()">点我加1</button>
    </div>
    <script type="text/javascript">
        function add() {
            // 对象，属性，新值
            //Vue.set(outData, 'count', 20);
            //app.count++;
            //outData.count++;
            outData.pro[2] = "aaaa"; //如果不调用outData.count++ 进行改变DOM值 只调用这里 是无法改变的
            //VUE 无法监听数组的下标和长度的变化，是JS限制导致的
            //解决的办法就是Vue.set
            //是改变Vue实例app里面的data的值，
            Vue.set(app.pro, 2, "aaaa"); //OK
            Vue.set(app, "count", 100); //OK 
            Vue.set(app.pro, 3, "ddd"); //OK
            
        }
        //必须要再VUE调用之前声明
        var outData = {
            count: 10,
            pro: ["xxx", "yyy", "zzz"]
        }
        var app = new Vue({
            el: "#app",
            data: outData
        });
    </script>
</body>

</html>